// hdu3949
// 题意：
// 给定n(<=10000)个数，每个数不超过10^18次，现在你取出一些来xor，
// 不能为空，然后有q(<=10000)个询问，每次询问问第k小的xor值，如果没有
// 就输出-1。
//
// 题解：
// 求线性基（求完后注意对于第i个线性基，要把其他的基对应位如果有1要xor掉）。
// 然后第k小的就是把k二进制分解，如果k的第i位有1, 就xor上第i+1小的线性基。
// 比如第0位有1, 就xor最小的那个线性基。
//
// 然后要注意，如果有len个线性基，那么一共有2^len - 1个不同的xor值，但是
// 如果len!=n，这说这些数可以xor出0, 所以就有2^len个不同的xor值。
//
// 所以询问的时候，对于len!=n的情况，要把k减1。
//
// ml:run = $bin < input
#include <iostream>
#include <algorithm>
#include <functional>
#include <cstring>

int const maxlen = 60;
using ll = long long;
ll lb[maxlen + 4];
int n;

int main()
{
	std::ios_base::sync_with_stdio(false);
	int T; std::cin >> T;
	for (int ti = 1; ti <= T; ti++) {
		std::cout << "Case #" << ti << ":\n";
		std::cin >> n;
		std::memset(lb, 0, sizeof(lb));
		for (int i = 0; i < n; i++) {
			ll x; std::cin >> x;
			for (int j = maxlen; j >= 0; j--)
				if ((x >> j) & 1) {
					if (!lb[j]) { lb[j] = x; break; }
					else x ^= lb[j];
				}
		}
		for (int i = maxlen; i >= 0; i--) {
			if (!lb[i]) continue;
			for (int j = maxlen; j > i; j--)
				if ((lb[j] >> i) & 1) lb[j] ^= lb[i];
		}

		std::sort(lb, lb + maxlen, std::greater<ll>());
		ll len = 0;
		for (; lb[len]; len++);
		int q; std::cin >> q;
		ll tot = (1ll << len) - 1;
		if (len != n) tot++;
		for (int i = 0; i < q; i++) {
			ll k; std::cin >> k;
			if (k > tot) { std::cout << "-1\n"; continue; }
			if (len != n) k--;
			ll ans = 0;
			for (int j = len; j >= 0; j--)
				if ((k >> j) & 1) ans ^= lb[len - j - 1];
			std::cout << ans << "\n";
		}
	}
}

